#include <bits/stdc++.h>
using namespace std;

template<typename T> struct X;          //前置声明
template<typename T> X<T> * g(X<T> &);  //前置声明

template<typename T>
struct X {
    friend X<T> * g<>(X<T> &); // 模板函数友无要在函数名后加<> 表明它是一个模板函数

    X(){
        print();
    }
    void print(){
        cout << a << endl;
    }
    private:
        int a = 1;
};

template<typename T>
X<T> * g(X<T> &t) {
    t.a = 100;
    return &t;
}


int main(){
    X<int> x;
    g(x); //c++17 推导出来了
    x.print();
    return 0;
}
